home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Games / NeXTGo / Source / smartgoeval.c < prev    next >
C/C++ Source or Header  |  1993-02-08  |  6KB  |  392 lines

  1. #include "comment.header"
  2.  
  3. /*  Define the following if you want to debug the move list features.  */
  4. /*  #define _DEBUG_MOVE_LISTS_  */
  5.  
  6. #include <strings.h>
  7. #include "smartgo.h"
  8. #include "smgcom.h"
  9.  
  10. #define EMPTY 0
  11. #define WHITE 1
  12. #define BLACK 2
  13. #define MARK 3
  14. #define LETTER 6
  15.  
  16. #ifdef _DEBUG_MOVE_LISTS_
  17. #include <stdio.h>
  18.  
  19. void display_current_board(unsigned char b[19][19])
  20. {
  21.   int i, j;
  22.   extern int MAXX, MAXY;
  23.  
  24.   printf("  ");
  25.   for (i = 0; i < MAXX; i++)
  26.     printf("%c ", i+'a');
  27.   printf("\n");
  28.   for (i = 0; i < MAXX; i++)
  29.     {
  30.       printf("%c ", i+'a');
  31.       for (j = 0; j < MAXY; j++)
  32.     switch (b[j][i]) {
  33.     case 0:
  34.       printf(". ");
  35.       break;
  36.     case 1:
  37.       printf("O ");
  38.       break;
  39.     case 2:
  40.       printf("X ");
  41.       break;
  42.     case 3:
  43.       printf("M ");
  44.       break;
  45.     case 4:
  46.       printf("w ");
  47.       break;
  48.     case 5:
  49.       printf("b ");
  50.       break;
  51.     case 6:
  52.       printf("S ");
  53.       break;
  54.     default:
  55.       break;
  56.     }
  57.       printf("\n");
  58.     }
  59.   printf("\n");
  60. }
  61. #endif
  62.  
  63. char* parseSGMove(char *c0, int *x, int *y)
  64. {
  65.   if (*c0 == '[')
  66.     c0++;
  67.  
  68.   *x = *c0 - 'a';
  69.   c0++;
  70.   *y = *c0 - 'a';
  71.   c0++;
  72.  
  73.   if (*c0 == ']')
  74.     c0++;
  75.  
  76.   return c0;
  77. }
  78.  
  79. char* parseRegularMove(Token t, char* c0, unsigned char b[19][19])
  80. {
  81.   int i, j;
  82.   unsigned char temp[19][19];
  83.   extern int MAXX, MAXY, currentStone, opposingStone;
  84.   extern unsigned char p[19][19];
  85.   extern void examboard(int);
  86.  
  87.   c0 = parseSGMove(c0, &i, &j);
  88.  
  89.   if ((i >= 0) && (i < MAXX) && (j >= 0) && (j < MAXY))
  90.     {
  91.       switch (t)
  92.     {
  93.     case t_White:
  94.       b[i][j] = WHITE;
  95.       currentStone = WHITE;
  96.       opposingStone = BLACK;
  97.       break;
  98.     case t_Black:
  99.       b[i][j] = BLACK;
  100.       currentStone = BLACK;
  101.       opposingStone = WHITE;
  102.       break;
  103.     default:
  104.       break;
  105.     }
  106.       for (i = 0; i < MAXX; i++)
  107.     for (j = 0; j < MAXY; j++)
  108.       temp[i][j] = p[i][j];
  109.       for (i = 0; i < MAXX; i++)
  110.     for (j = 0; j < MAXY; j++)
  111.       p[i][j] = b[i][j];
  112.       examboard(opposingStone);
  113.       for (i = 0; i < MAXX; i++)
  114.     for (j = 0; j < MAXY; j++)
  115.       b[i][j] = p[i][j];
  116.       for (i = 0; i < MAXX; i++)
  117.     for (j = 0; j < MAXY; j++)
  118.       p[i][j] = temp[i][j];
  119.     }
  120.   return c0;
  121. }
  122.  
  123. char* parseComment(char* c0)
  124. {
  125.   int i;
  126.   extern char sgComment[2000];
  127.  
  128.   if (*c0 == '[')
  129.     c0++;
  130.  
  131.   i = 0;
  132.   while (*c0 != ']')
  133.     {
  134.       if (*c0 == '\\')
  135.     c0++;
  136.       sgComment[i] = *c0;
  137.  
  138.       i++;
  139.       c0++;
  140.     }
  141.   sgComment[i] = 0;
  142.   return c0;
  143. }
  144.  
  145. char* parseMoveList(Token t, char* c0, unsigned char b[19][19])
  146. {
  147.   int x, y;
  148.   extern int MAXX, MAXY;
  149.  
  150.   while (*c0 == '[')
  151.     {
  152.       c0 = parseSGMove(c0, &x, &y);
  153.  
  154.       if ((x >= 0) && (x < MAXX) && (y >= 0) && (y < MAXY))
  155.     switch (t)
  156.       {
  157.       case t_AddWhite:
  158.         b[x][y] = WHITE;
  159.         break;
  160.       case t_AddBlack:
  161.         b[x][y] = BLACK;
  162.         break;
  163.       case t_Letter:
  164.         b[x][y] = LETTER;
  165.         break;
  166.       case t_Mark:
  167.         b[x][y] = MARK;
  168.         break;
  169.       case t_AddEmpty:
  170.         b[x][y] = EMPTY;
  171.         break;
  172.       default:
  173.         break;
  174.       }
  175.       if (*c0 == '\n')
  176.     c0++;
  177.     }
  178. #ifdef _DEBUG_MOVE_LISTS_
  179.   display_current_board(b);
  180. #endif
  181.   return c0;
  182. }
  183.  
  184. char* parseNodeName(char* c0)
  185. {
  186.   int i;
  187.   extern char sgNodeName[200];
  188.  
  189.   if (*c0 == '[')
  190.     c0++;
  191.  
  192.   i = 0;
  193.   while (*c0 != ']')
  194.     {
  195.       if (*c0 == '\\')
  196.     c0++;
  197.       sgNodeName[i] = *c0;
  198.  
  199.       i++;
  200.       c0++;
  201.     }
  202.   sgNodeName[i] = 0;
  203.   return c0;
  204. }
  205.  
  206. char* parseSize(char* c0)
  207. {
  208.   int i, j;
  209.   char sizeStr[10];
  210.   extern int MAXX, MAXY;
  211.  
  212.   if (*c0 == '[')
  213.     c0++;
  214.  
  215.   i = 0;
  216.   while (*c0 != ']')
  217.     {
  218.       sizeStr[i] = *c0;
  219.       i++;
  220.       c0++;
  221.     }
  222.  
  223.   sscanf(sizeStr, "%d", &j);
  224.   if ((j > 0) && (j <= 19))
  225.     MAXX = MAXY = j;
  226.   return c0;
  227. }
  228.  
  229. char* parseHandicap(char* c0)
  230. {
  231.   int i, j;
  232.   char handStr[10];
  233.   extern int handicap;
  234.  
  235.   if (*c0 == '[')
  236.     c0++;
  237.  
  238.   i = 0;
  239.   while (*c0 != ']')
  240.     {
  241.       handStr[i] = *c0;
  242.       i++;
  243.       c0++;
  244.     }
  245.  
  246.   sscanf(handStr, "%d", &j);
  247.   if ((j > 0) && (j <= 9))
  248.     handicap = j;
  249.   return c0;
  250. }
  251.  
  252. char* parseInfo(Token t, char* c0)
  253. {
  254.   int i;
  255.   char sgInfo[2000];
  256.  
  257.   if (*c0 == '[')
  258.     c0++;
  259.  
  260.   i = 0;
  261.   while (*c0 != ']')
  262.     {
  263.       if (*c0 == '\\')
  264.     c0++;
  265.       sgInfo[i] = *c0;
  266.  
  267.       i++;
  268.       c0++;
  269.     }
  270.   sgInfo[i] = 0;
  271.   return c0;
  272. }
  273.  
  274. char* parseKomi(char* c0)
  275. {
  276.   int i;
  277.   char komiStr[10];
  278.   float komiValue;
  279.  
  280.   if (*c0 == '[')
  281.     c0++;
  282.  
  283.   i = 0;
  284.   while (*c0 != ']')
  285.     {
  286.       komiStr[i] = *c0;
  287.       i++;
  288.       c0++;
  289.     }
  290.  
  291.   sscanf(komiStr, "%f", &komiValue);
  292.   return c0;
  293. }
  294.  
  295. void evaluateNode(char* c, unsigned char b[19][19])
  296. {
  297.   int i, j, k;
  298.   extern int MAXX, MAXY;
  299.   char *c0, command[3];
  300.   Token t;
  301.   extern char sgComment[2000], sgNodeName[200];
  302.  
  303.   strcpy(sgComment, "");
  304.   strcpy(sgNodeName, "");
  305.  
  306.   for (i = 0; i < MAXX; i++)
  307.     for (j = 0; j < MAXY; j++)
  308.       if (b[i][j] > 2)
  309.     b[i][j] = 0;
  310.  
  311.   c0 = c;
  312.   if (*c0 == ';' || *c0 == '(' || *c0 == ')')
  313.     c0++;
  314.  
  315.   command[0] = command[1] = command[2] = 0;
  316.   i = 0;
  317.   j = 1;
  318.  
  319.   do
  320.     {
  321.       if ((*c0 == ';') || (*c0 == '(') || (*c0 == ')'))
  322.     {
  323.       j = 0;
  324.     }
  325.       else if ((*c0 >= 'A') && (*c0 <= 'Z'))
  326.     {
  327.       command[i] = *c0;
  328.       c0++;
  329.       i++;
  330.     }
  331.       else if (*c0 == '[')
  332.     {
  333.       command[i] = 0;
  334.       i = 0;
  335.       t = t_WS;
  336.       for (k = 0; k < 27; k++)
  337.         if (strcmp(command, commands[k].str) == 0)
  338.           t = commands[k].val;
  339.  
  340.       switch (t)
  341.         {
  342.         case t_White:
  343.         case t_Black:
  344.           c0 = parseRegularMove(t, c0, b);
  345.           break;
  346.         case t_Comment:
  347.           c0 = parseComment(c0);
  348.           break;
  349.         case t_AddWhite:
  350.         case t_AddBlack:
  351.         case t_Letter:
  352.         case t_Mark:
  353.         case t_AddEmpty:
  354.           c0 = parseMoveList(t, c0, b);
  355.           break;
  356.         case t_Name:
  357.           c0 = parseNodeName(c0);
  358.           break;
  359.         case t_Size:
  360.           c0 = parseSize(c0);
  361.           break;
  362.         case t_Handicap:
  363.           c0 = parseHandicap(c0);
  364.           break;
  365.         case t_PlayerBlack:
  366.         case t_PlayerWhite:
  367.         case t_WhiteRank:
  368.         case t_BlackRank:
  369.         case t_GameName:
  370.         case t_Event:
  371.         case t_Round:
  372.         case t_Date:
  373.         case t_Place:
  374.         case t_TimeLimit:
  375.         case t_Result:
  376.         case t_GameComment:
  377.         case t_Source:
  378.         case t_User:
  379.           c0 = parseInfo(t, c0);
  380.           break;
  381.         case t_Komi:
  382.           c0 = parseKomi(c0);
  383.           break;
  384.         default:
  385.           c0++;
  386.           break;
  387.         }
  388.     }
  389.       else c0++;
  390.     } while (j);
  391. }
  392.